package com.SDU.policedispatch.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import com.SDU.policedispatch.entity.PersonnelInfo;
import com.SDU.policedispatch.mapper.PolicemanMapper;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class PoliceService {

    @Autowired
    private PolicemanMapper policemanMapper;

    @Transactional
    public List<PersonnelInfo> assignPolice(int count) {
        // 获取所有可用的警察
        List<PersonnelInfo> availablePolice = policemanMapper.allselect();
        
        // 过滤出状态为"非工作中"的警察
        availablePolice = availablePolice.stream()
                .filter(p -> p.getPoliceType().equals("非工作中"))
                .collect(Collectors.toList());
    
        // 如果可用的警察数量不足，抛出一个异常
        if (availablePolice.size() < count) {
            throw new RuntimeException("Not enough available police.");
        }
    
        // 选择指定数量的警察
        List<PersonnelInfo> assignedPolice = availablePolice.subList(0, count);
    
        // 更新警察的状态为已分配
        for (PersonnelInfo policeman : assignedPolice) {
            policeman.setPoliceType("工作中");
            // 假设你已经在PolicemanMapper中定义了一个update方法
            policemanMapper.update(policeman);
        }
    
        return assignedPolice;
    }
    
    @Transactional
    public List<PersonnelInfo> assignPolice(int count, String department) {
        // 获取所有可用的警察
        List<PersonnelInfo> availablePolice = policemanMapper.allselect();
    
        // 过滤出状态为"非工作中"并且在特定部门的警察
        availablePolice = availablePolice.stream()
                .filter(p -> p.getPoliceType().equals("非工作中") && p.getDepartmentId().equals(department))
                .collect(Collectors.toList());
    
        // 如果可用的警察数量不足，抛出一个异常
        if (availablePolice.size() < count) {
            throw new RuntimeException("Not enough available police in " + department + " department.");
        }
    
        // 选择指定数量的警察
        List<PersonnelInfo> assignedPolice = availablePolice.subList(0, count);
    
        // 更新警察的状态为已分配
        for (PersonnelInfo policeman : assignedPolice) {
            policeman.setPoliceType("工作中");
            // 假设你已经在PolicemanMapper中定义了一个update方法
            policemanMapper.update(policeman);
        }
    
        return assignedPolice;
    }
    

    @Transactional
    /*
     * double ratio参数，这个比例将被用来决定应该分配多少男性警察。
     * 我们将假设这个比例是一个0到1之间的数字，
     * 其中1表示全部是男性，0.5表示男女各半，0表示全部是女性等。
     */
    public List<PersonnelInfo> assignPolice(int count, double ratio) {
        // 获取所有可用的警察
        List<PersonnelInfo> availablePolice = policemanMapper.allselect();
    
        // 过滤出状态为"非工作中"的警察，并按性别分组
        Map<String, List<PersonnelInfo>> groupedPolice = availablePolice.stream()
                .filter(p -> p.getPoliceType().equals("非工作中"))
                .collect(Collectors.groupingBy(PersonnelInfo::getSex));
    
        // 根据给定的比例计算应该分配多少男性警察
        int maleCount = (int) Math.round(count * ratio);
    
        // 检查是否有足够的男性和女性警察
        if (groupedPolice.get("男").size() < maleCount || groupedPolice.get("女").size() < count - maleCount) {
            throw new RuntimeException("Not enough available police to maintain the given gender ratio.");
        }
    
        // 选择指定数量的警察，根据给定的比例分配男性和女性
        List<PersonnelInfo> assignedPolice = new ArrayList<>();
        assignedPolice.addAll(groupedPolice.get("男").subList(0, maleCount));
        assignedPolice.addAll(groupedPolice.get("女").subList(0, count - maleCount));
    
        // 更新警察的状态为已分配
        for (PersonnelInfo policeman : assignedPolice) {
            policeman.setPoliceType("工作中");
            // 假设你已经在PolicemanMapper中定义了一个update方法
            policemanMapper.update(policeman);
        }
    
        return assignedPolice;
    }
}